// 导入插件基类
import plugin from '../../../lib/plugins/plugin.js'
// 导入同步执行系统命令的函数
import { execSync } from 'child_process'
// 导入更新模块
import { update } from '../../other/update.js'
// 导入版本和通用函数
import { Version, Common, Plugin_Name } from '../components/index.js'

/**
 * 指令服务器类，继承自插件基类
 */
export class instructionServer extends plugin {
    /**
     * 构造函数，初始化指令服务器
     */
    constructor() {
        super({
            name: 'administration-plugin', // 功能名称
            dsc: '调用Yunzai自带更新模块进行插件更新', // 功能描述
            event: 'message', // 监听的事件类型
            priority: 2000, // 事件优先级
            rule: [ // 规则数组，定义了命令匹配正则和对应的执行方法
                {
                    reg: '^#?管理(插件)?(强制)?更新', // 命令正则匹配
                    fnc: 'update', // 执行方法
                    permission: 'master' // 执行权限
                },
                {
                    reg: '^#?管理(插件)?版本', // 命令正则匹配
                    fnc: 'version', // 执行方法
                },
                {
                    reg: '^#?管理(插件)?更新日志', // 命令正则匹配
                    fnc: 'log', // 执行方法
                },
            ]
        });
    }

    /**
     * 更新插件的方法
     */
    async update() {
        let Update_Plugin = new update();
        Update_Plugin.e = this.e;
        Update_Plugin.reply = this.reply;

        if (Update_Plugin.getPlugin(Plugin_Name)) {
            if (this.e.msg.includes('强制')) {
                // 如果消息中包含'强制'，则执行硬重置
                await execSync('git reset --hard', { cwd: `${process.cwd()}/plugins/${Plugin_Name}/` });
            }
            // 执行更新
            await Update_Plugin.runUpdate(Plugin_Name);
            if (Update_Plugin.isUp) {
                // 如果更新成功，2秒后重启插件
                setTimeout(() => Update_Plugin.restart(), 2000)
            }
        }
        return true;
    }

    /**
     * 获取插件版本信息的方法
     */
    async version() {
        return versionInfo(this.e);
    }

    /**
     * 获取插件更新日志的方法
     */
    async log() {
        let Update_Plugin = new update();
        Update_Plugin.e = this.e;
        Update_Plugin.reply = this.reply;

        if (Update_Plugin.getPlugin(Plugin_Name)) {
            // 回复更新日志
            this.e.reply(await Update_Plugin.getLog(Plugin_Name));
        }
        return true;
    }
}

/**
 * 获取版本信息的异步函数
 * @param {Object} e - 事件对象
 * @returns {Promise} - 返回版本信息的渲染结果
 */
async function versionInfo(e) {
    return await Common.render('help/version-info', {
        currentVersion: Version.ver, // 当前版本号
        changelogs: Version.logs, // 更新日志
        elem: 'cryo' // 元素类型
    }, { e, scale: 1.2 })
}
